package travelDream.web.beans;

import java.text.Format;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import travelDream.ejb.Gestione;
import travelDream.ejb.gestionePacchetto.GiornataDTO;
import travelDream.ejb.gestionePacchetto.PacchettoDTO;
import travelDream.ejb.prodotto.base.EscursioneDTO;
import travelDream.ejb.prodotto.base.HotelDTO;
import travelDream.ejb.prodotto.base.VoloDTO;

@ManagedBean(name="aggiornamento")
@SessionScoped
public class AggiornamentoPaginaUtente {
	
	@EJB
	private Gestione gest;
	
	private List<PacchettoDTO> pacchettiScelti;
	
	private PacchettoDTO pacchetto;
	
	private int idPacchetto;
	
	private int numeroGiornata;
	
	private Date date;
	
	public AggiornamentoPaginaUtente(){
		System.out.println("creazione bean");
		this.pacchetto = new PacchettoDTO();
	
	}
	
	public String getName() {
		return gest.getUtenteDTO().getNickname();
	}
	
	public List<PacchettoDTO> getPacchettiUtente(){
		
		List<PacchettoDTO> pacchetti = gest.getPacchettiUtente();
		
		return pacchetti;
	}
	
	public List<PacchettoDTO> getPacchettiPredefiniti(){
		return gest.getPacchettiPredefiniti();
	}


	public int getIdPacchetto() {
		return idPacchetto;
	}

	
	public void setIdPacchetto(int idPacchetto) {
		this.idPacchetto = idPacchetto;
		System.out.println("Ho settato l'id pacchetto");
	}

	public List<PacchettoDTO> getPacchettiScelti() {
		return pacchettiScelti;
	}


	public void setPacchettiScelti(List<PacchettoDTO> pacchettiScelti) {
		this.pacchettiScelti = pacchettiScelti;
	}
	
	public void setPacchettoSceltoById(int idPacchetto) {
		this.pacchetto = gest.creaPacchettoSceltoOggetto(idPacchetto);
	}
	
	/**
	 * Setta il pacchetto che si deve visualizzare, aggiungendo escursioni fittizie con nome Aggiungi
	 * per poter aggiungere una escursione anche dove non ce ne siano
	 * @param idPacchetto
	 */
	public void setPacchettoPredefinitoById(int idPacchetto){
		this.pacchetto = gest.creaPacchettoPredefinitoOggetto(idPacchetto);
		
		for(int i = 0; i < this.pacchetto.getGiornate().size(); i ++){
			GiornataDTO giornata = this.pacchetto.getGiornata(i);
			System.out.println(giornata.getTrasporto().getVolo().getLuogoArrivo());
			if(giornata.getEscursione().getNome() == null){
				giornata.getEscursione().setNome("Aggiungi");
				if(giornata.getHotel().getNome() == null){
					String luogo = this.pacchetto.getGiornata(i - 1).getHotel().getLuogo();
					giornata.getEscursione().setLuogo(luogo);
				}else{
					giornata.getEscursione().setLuogo(giornata.getHotel().getLuogo());
				}
			}
		}
	}
	
	public PacchettoDTO getPacchetto(){
		return pacchetto;
	}
	

	public int getNumeroGiornata() {
		return numeroGiornata;
	}

	public void setNumeroGiornata(int numeroGiornata) {
		this.numeroGiornata = numeroGiornata - 1;
	}

	/**
	 * @return the date
	 */
	public Date getDate() {
		return date;
	}

	/**
	 * @param date the date to set
	 */
	public void setDate(Date date) {
		this.date = date;
	}

	public String invito(){
		
		PacchettoDTO pacchetto = gest.creaPacchettoSceltoOggetto(idPacchetto);
		if(pacchetto == null){
			return "erroreCodice_utente";
		}
		this.pacchetto = pacchetto;
		
		return "invito_utente";
	}
	
	public String invitoEsterno(){
		PacchettoDTO pacchetto = gest.creaPacchettoSceltoOggetto(idPacchetto);
		if(pacchetto == null){
			return "erroreCodice";
		}
		this.pacchetto = pacchetto;
		
		return "visualizzaViaggio";
	}
	
	public String nuovoPartecipante(){
		gest.nuovoPartecipante(idPacchetto);
		return "home_utente";
	}
	
	
	public String eliminaPacchetto(int idPacchetto){
		gest.eliminaPacchettoScelto(idPacchetto);
		return "home_utente";
	}
	
	public List<VoloDTO> listaVoloPerSceltaUtente(){
		System.out.println(this.numeroGiornata);
    	String partenza = this.pacchetto.getGiornata(this.numeroGiornata).getTrasporto().getVolo().getLuogoPartenza();
    	String arrivo = this.pacchetto.getGiornata(this.numeroGiornata).getTrasporto().getVolo().getLuogoArrivo();
		 	
    	if(numeroGiornata + 1 == 1){
    		return gest.listaVoloConArrivo(arrivo);
    	}else{
    		if(numeroGiornata + 1 == this.pacchetto.getGiornate().size()){
    			return gest.listaVoloConPartenza(partenza);
    		}else{
    			return gest.listaVoloConPartenzaEArrivo(partenza,arrivo);
    		}
    	}
    }
	
	public List<HotelDTO> listaHotel(String luogo){
    	return gest.listaHotel(luogo);
    }
	
	public List<EscursioneDTO> listaEscursione(String luogo){
    	return gest.listaEscursione(luogo);
    }
	
	public String cambiaEscursione(EscursioneDTO escursione){
		System.out.println(escursione.getNome());
		System.out.println(this.numeroGiornata);
		
		this.pacchetto.getGiornata(numeroGiornata).setEscursione(escursione);
		
		return"pacchettoPred_utente";
	}
	
	public String cambiaHotel(HotelDTO hotel){
		System.out.println(hotel.getNome());
		System.out.println(this.numeroGiornata);
		
		this.pacchetto.getGiornata(numeroGiornata).setHotel(hotel);
		
		return"pacchettoPred_utente";
	}
	
	public String cambiaVolo(VoloDTO volo){
		System.out.println(volo.getLuogoArrivo());
		System.out.println(this.numeroGiornata);
		
		this.pacchetto.getGiornata(numeroGiornata).getTrasporto().setVolo(volo);
		
		return"pacchettoPred_utente";
	}
	
	public String salvaPacchetto(){
		
		String dateString = convertData(date);
		
		
		this.pacchetto.setDataPartenza(dateString);
		this.date = null;
		System.out.println(this.pacchetto.getDataPartenza());
		gest.salvaPacchetto(this.pacchetto);
		return "home_utente";
	}

	private String convertData(Date date){
		Format format = new SimpleDateFormat("dd/MM/yyyy");
		return format.format(date).toString();
	}

	
	public String eliminaEscursione(){
		this.pacchetto.getGiornata(numeroGiornata).getEscursione().setNome("Aggiungi");
		return "pacchettoPred_utente";
	}

	
	public int getCostoTotale(){
		int costo = 0;
		for(GiornataDTO g : this.pacchetto.getGiornate()){
			try{
				costo += g.getEscursione().getCosto();
			}
			catch(NullPointerException e){
			}
			try{
				costo += g.getHotel().getCosto();
			}
			catch(NullPointerException e){
			}
			try{
				costo += g.getTrasporto().getVolo().getCosto();
			}
			catch(NullPointerException e){
			}
		}
		return costo;
	}

}
